// function* generatorFn() {
//     yield* [1, 2, 3, 4]
// }

// const gf = generatorFn()

// console.log('gf is', gf);
// // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// //@ts-expect-error
// console.log('finish gf ', gf.return(4));
// console.log('next gf ', gf.next());

// const gf2 = generatorFn()

// for (const v of gf2) {
//     if (v > 1) {
//         gf2.return(4)
//     }
//     console.log('value from gf2', v);
// }

class ClassRoom implements Iterable<string> {
  private students: string[] = [];

  // 加入学生
  add(name: string) {
    this.students.push(name);
  }

  // ★★★★★ 关键就这一行！让整个班级变得可遍历
  *[Symbol.iterator](this: ClassRoom) {
    yield* this.students; // 借用数组的迭代器
    // 或者更优雅地自己实现（下面有两种写法）
  }

  // 或者直接写成自举的完整迭代器（推荐写法）
  // [Symbol.iterator]() { return this.makeIterator(); }
  // private *makeIterator() {
  //   for (const s of this.students) yield s;
  // }
}

// 用法美得让人想哭
const class401 = new ClassRoom();

class401.add('小明');
class401.add('小红');
class401.add('小刚');

for (const student of class401) {
  console.log('student is', student);
}

// const tie2 = Iterator.from(class401).map((student) => {
//   return student + '同学';
// });

// // const tie3 = tie2.drop(1);

// for (const name of tie2) {
//   console.log('tie2', name);
// }

// for (const name of tie2) {
//   console.log('tie3', name);
// }

// console.log('class401 is', class401);

// // 下面这几行代码，读起来就像在说中文一样自然：
// for (const student of class401) {
//     console.log('上课点名：', student);
// }

// // 还能直接展开、解构、Set 去重……想怎么玩怎么玩
// console.log([...class401]);                    // ['小明', '小红', '小刚']
// const [monitor, viceMonitor] = class401;       // 解构第一二名
// const uniqueStudents = new Set(class401);

// console.log('monitor is', monitor);
// console.log('viceMonitor is', viceMonitor);
// console.log('uniqueStudents is', uniqueStudents);
// 输出：Set { '小明', '小红', '小刚' }
